'''
1.ORM概述
    解释：
        1.将类名，属性，映射成是数据库的表名和字段
        2.类的对象，会映射成为数据库表中的一行一行的数据
    优缺点：
        优点
            1.不需要编写sql语句
            2.不在关心使用的是什么数据库了
        缺点
            3.由于不是直接操作数据库，所以有一点内存损失

2.创建数据库表格
    1.安装两个模块
    2.设置数据库的配置信息
    3.创建sqlalchemy对象db，关联app
    4.编写模型类，字段，他们是继承自db.Model
    5.操作数据库
        -增，删，改
        -查

3.ORM操作注意：
    注意点：
        因为SQLALChemy是去app身上读取配置信息，所以需要设置到app.config身上
        1.数据库的连接信息
            如果安装的是flask_mysqldb 那么连接信息为：“mysql://<用户名>：<密码>@<ip地址>：<端口号>/<数据库的名字>”
            如果安装的是flask_pymysql 那么连接信息为：“mysql+pymysql://<用户名>：<密码>@<ip地址>：<端口号>/<数据库的名字>”
        2.编写的模型必须继承自db.Model才能被映射
        3.如果不指定表名称，默认生成的就是模型类的小写，想指定的话在类中添加：__tablename__ = "名字" 就可以指定了
        4.删除表就是：db.drop_all()
        5.ORM映射时不能生成数据库。只能生成数据库的表

4.数据库的增，删，改
    1.全部使用db.session操作
    方法：
        db.session.add(obj)添加单个对象
        db.session.add_all(obj1,obj2,---)添加多个对象
        db.session.delete(obj)删除单个对象
        db.session.commit()提交会话
        db.drop_all()删除继承自db.Model的所有表
        db.create_all()创建继承自ab,Model的所有表
        其他：
            db.session.rollback()回滚
            db.session.remove()移除会话
    案例1：写了两个模型，是一对多的关系  day03--02

5.数据库基本查询
    全部都是通过，模型类 .query进行
        使用常见的12条语句

6.数据库关系查询relationship    里面的参数不会产生实体字段，就是方便查询
    解释：
        为了方便数据库的查询
        格式：
            relationship添加关系属性，就可以快速查询
            users = db.relationship('多方的模型类')     # 变量 = db.relationship（‘需要快速查询的类名’）
            使用格式：
                relos = relo.query.get(1)  # 这里是 取个名字 = 需要查询的语句
                users = relo.users         # 然后直接  .变量 就可以了   这个变量是上面 users = db.relationship('多方的模型类') 的名字

    backref 就是反相查询,
    格式：
        在上面的语句中继续添加一个数值
        users = db.relationship('多方的模型类',backref="随便什么名字")     之后再反相的时候就直接 ."随便什么名字" 就可以了

7.数据库查询lazy
    解释：一旦使用了relationship,backref 那么系统会自动做子查询
        现在我们想我们用到的时候她才做子查询
    lazy使用：
        users = db.relationship('多方的模型类',backref="随便什么名字",lazy="dynamic")    # 这个是固定的值，也是在上面的语句中添加的



8.图书馆案例的数据库搭建： 一对多的关系  第三天的 library 文件
    分析数据库案例：
        1.数据库配置
            - 书籍模型        注意：一定要将模型类继承 db.Moudel
            - 作者模型
        2.添加测试数据
        3.添加作者，书籍
        4.删除作者，删除书籍

9.学生课表： 多对多的关系  第三天的 many to many 文件

10.数据库的迁移
目的：当数据库的表结构发生变化之后，如果直接删除原有的数据，在添加新数据，有可能导致数据丢失
注意点：
    1.是为了备份表结构，而不是数据
    2.如果想要备份数据，就需要用到数据库客户端 Navicat
    3.更新的过程数据一般不会丢失
操作流程：
    1.扩展： flask_script,flask_migrate
    2.导入三个类
        flask_script 的 Manager
        flask_migrate 的 Migrate,MigrateCommand
    3.通过 Manager 创建 manager 管理app
        manager = Manager(app)
    4.使用 Migrate ,关联 app db
        Migrate(app,db)
    5.给 manager 添加一条操作指令
        manager.add_command('db',MigrateCommand)
        以脚本的形式运行得加一个 runserver
    6.相关性的迁移命令：
        1.生成迁移文件夹 【一次就好】
            python xxx.py db init
        2.将模型类生成迁移脚本  【变化后重复执行】
            python xxx.py db migrate -m '注释'
        3.将迁移脚本更新到数据库中  【变化后重复执行】
            python xxx.py db upgrade
        4.版本上下改动
            upgrade 往上走一个版本           downgrade 往下走一个版本
        5.其他命令：
            查看最新的版本：python xxx.py db show
            查看所有的版本：python xxx.py db history

'''





















